package main

import (
	"fmt"
	"sync"
	"time"
)
// 互斥锁 是对共享资源的访问控制的手段 防止竞争
var count = 0
var wg sync.WaitGroup
var mutex sync.Mutex

func test() {
	mutex.Lock() // 加锁 当有一个协程进行这个操作时加锁 其他协程只能等待
	count++
	fmt.Println("The count is:", count)
	time.Sleep(1 * time.Second)
	mutex.Unlock() // 解锁 释放锁 其他协程可以进行操作 随机一个
	wg.Done()
}

func main() {
	for r := 0; r < 20; r++ {
		wg.Add(1)
		go test()
	}
	wg.Wait()
}